package com.tungse.extends_super;

import java.util.ArrayList;
import java.util.List; /**
 * java中<? extends T>和<? super T>上界下界
 *
 * -如果只读取，用extends-
 * -如果只写入，用super-
 * 如果既要读又要写，别用通配符！
 * // 不要这样
 * public void confusingMethod(List<?> list) {...}
 *
 * // 要这样
 * public <T> void clearMethod(List<T> list) {...}
 */
public class ExtendsAndSuperDemo {
    public static void main(String[] args) {

        //extends
        List<? extends Animal> animals = new ArrayList<Dog>();  //   可以
        List<? extends Animal> animals1 = new ArrayList<Cat>();  //   也可以r/>
        // 但是！
        //animals.add(new Dog()); // ❌ 编译报错
        //animals.add(new Cat()); // ❌ 编译报错
        //animals.add(new Animal()); // ❌ 还是报错
        Animal animal = animals.get(0); // ✅ 读取没问题



        //super
        List<? super Dog> dogs = new ArrayList<Dog>();  //   可以
        List<? super Dog> dogs1 = new ArrayList<Object>();  //   也可以

        dogs.add(new Dog()); // ✅ 可以添加Dog
        dogs.add(new Husky()); // ✅ 可以添加Dog的子类

        //Dog dog = dogs.get(0); // ❌ 编译报错
        Object obj = dogs.get(0); // ✅ 只能以Object接收
    }

    // extends  当你只需要读取数据时
    public void printAnimals(List<? extends Animal> animals) {
        for (Animal a : animals) { // 安全，因为知道都是Animal
            System.out.println(a.getName());
        }
    }

    // super  当你需要写入数据时
    public void addDogs(List<? super Dog> dogs) {
        dogs.add(new Dog()); // 安全，因为容器至少能装Dog
        dogs.add(new Husky()); // Husky是Dog的子类，也没问题
    }


}
// 假设有一个类结构：
class Animal {public String getName() {return "Animal";}}
class Dog extends Animal {public String getName() {return "Dog";}}
class Cat extends Animal {public String getName() {return "Cat";}}
class Husky extends Dog {public String getName() {return "Husky";}}


